libxl: add all pci devices to xenstore at once (during VM create)
authorMarek Marczykowski <marmarek@mimuw.edu.pl>
Tue, 21 Jun 2011 16:50:47 +0000 (17:50 +0100)
committerMarek Marczykowski <marmarek@mimuw.edu.pl>
Tue, 21 Jun 2011 16:50:47 +0000 (17:50 +0100)
When adding pci devices one by one, pciback notice only the first one. For
every next, "state" is left as is (usualy "4" in that time), so backend will
not rescan xenstore. So when VM is starting all devices should be added at once
and then backend can initialize it.

This applies only to pci, because only pci backend have one xenstore dir for
multiple devices.

Signed-off-by: Marek Marczykowski <marmarek@mimuw.edu.pl>
Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Committed-by: Ian Jackson <ian.jackson@eu.citrix.com>
tools/libxl/libxl_create.c
tools/libxl/libxl_internal.h
tools/libxl/libxl_pci.c

index 91e2414f7e5f28cea601d615b6cadb6fcaddc88a..1b7fd610340dc21ae4471092d5b0b3f5aaa97793 100644 (file)
@@ -525,6 +525,14 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
     for (i = 0; i < d_config->num_pcidevs; i++)
         libxl__device_pci_add(gc, domid, &d_config->pcidevs[i], 1);
 
+    ret = libxl__create_pci_backend(gc, domid, d_config->pcidevs,
+                                    d_config->num_pcidevs);
+    if (ret < 0) {
+        LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+                   "libxl_create_pci_backend failed: %d", ret);
+        goto error_out;
+    }
+
     if (!d_config->c_info.hvm && d_config->b_info.u.pv.e820_host) {
         int rc;
         rc = libxl__e820_alloc(ctx, domid, d_config);
index 3d3bf52f0ccce2a1ad9e259045e1ec34bb5e9ae5..49665b891a5949a8a5e8b32bcc7a391f438cb953 100644 (file)
@@ -226,6 +226,8 @@ _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
 /* from libxl_pci */
 
 _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);
+_hidden int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid,
+                                      libxl_device_pci *pcidev, int num);
 
 /* xl_exec */
 
index 307ca2376b238355384799c3ce60f733aef67870..8d2c4d19a381cabb0ca7764a9f3bacfc48dbdf89 100644 (file)
@@ -221,7 +221,8 @@ static void libxl_create_pci_backend_device(libxl__gc *gc, flexarray_t *back, in
     flexarray_append_pair(back, libxl__sprintf(gc, "state-%d", num), libxl__sprintf(gc, "%d", 1));
 }
 
-static int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num)
+int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid,
+                              libxl_device_pci *pcidev, int num)
 {
     libxl_ctx *ctx = libxl__gc_owner(gc);
     flexarray_t *front = NULL;
@@ -707,7 +708,10 @@ out:
         }
     }
 
-    rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting);
+    if (!starting)
+        rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting);
+    else
+        rc = 0;
     return rc;
 }